﻿using Pe.Petecos.Comercial.Cross.Core.Constantes;
using Pe.Petecos.Comercial.Infraestructura.Core.Contract.Ventas;
using Pe.Petecos.Comercial.Infraestructura.Model.Ventas;
using Pe.Petecos.Comercial.Infraestructura.Repository.Base;
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Pe.Petecos.Comercial.Infraestructura.Repository.Implements.Ventas
{
    public class ComprobantePagoRepository : QueryRepository, IComprobantePagoRepository
    {
        public List<ComprobantePagoLogic> Buscar(int codigoComprobantePago = 0, int codigoProveedor = 0, string codigoEstado = "", string nombreProveedor = "", string numeroComprobantePago = "", DateTime? fechaInicio = null, DateTime? fechaFin = null)
        {
            SqlParameter[] parametros = new SqlParameter[]
            {
                new SqlParameter("CODIGO_COMPROBANTE_PAGO", SqlDbType.Int) { Value = (object)codigoComprobantePago ?? DBNull.Value },
                new SqlParameter("CODIGO_PROVEEDOR", SqlDbType.Int) { Value = (object)codigoProveedor ?? DBNull.Value },
                new SqlParameter("CODIGO_ESTADO_COMPROBANTE_PAGO", SqlDbType.VarChar) { Value = (object)codigoEstado ?? DBNull.Value },
                new SqlParameter("NOMBRE_PROVEEDOR", SqlDbType.VarChar) { Value = (object)nombreProveedor ?? DBNull.Value },
                new SqlParameter("NUMERO_COMPROBANTE_PAGO", SqlDbType.VarChar) { Value = (object)numeroComprobantePago ?? DBNull.Value },
                new SqlParameter("FECHA_INICIO", SqlDbType.DateTime) { Value = (object)fechaInicio ?? DBNull.Value },
                new SqlParameter("FECHA_FIN", SqlDbType.DateTime) { Value = (object)fechaFin ?? DBNull.Value },
                new SqlParameter("PARAMETRO_ESTADO_COMPROBANTE_PAGO", SqlDbType.Int) { Value = DatosConstantes.Parametro.EstadoComprobantePago },
                new SqlParameter("PARAMETRO_TIPO_COMPROBANTE_PAGO", SqlDbType.Int) { Value = DatosConstantes.Parametro.TipoComprobantePago }
            };

            return this.dataBaseProvider.ExecuteStoreProcedure<ComprobantePagoLogic>("VTA.USP_COMPROBANTE_PAGO_SEL", parametros).ToList();
        }

        public int Insertar(ComprobantePagoEntity comprobantePago)
        {
            SqlParameter[] parametros = new SqlParameter[]
            {
                new SqlParameter("CODIGO_ORDEN_COMPRA", SqlDbType.Int) { Value = (object)comprobantePago.CodigoOrdenCompra ?? DBNull.Value },
                new SqlParameter("TIPO_COMPROBANTE_ORDEN", SqlDbType.NVarChar) { Value = (object)comprobantePago.TipoComprobanteOrden ?? DBNull.Value },
                new SqlParameter("NUMERO_COMPROBANTE_APAGAR", SqlDbType.NVarChar) { Value = (object)comprobantePago.NumeroComprobanteApagar ?? DBNull.Value },
                new SqlParameter("CODIGO_MONEDA", SqlDbType.NVarChar) { Value = (object)comprobantePago.CodigoMoneda ?? DBNull.Value },
                new SqlParameter("CODIGO_PROVEEDOR", SqlDbType.Int) { Value = (object)comprobantePago.CodigoProveedor ?? DBNull.Value },
                new SqlParameter("NOMBRE_PROVEEDOR", SqlDbType.NVarChar){ Value = (object)comprobantePago.NombreProveedor ?? DBNull.Value },
                new SqlParameter("ADELANTO_CUOTAS", SqlDbType.Bit){ Value = (object)comprobantePago.AdelantoCuotas ?? DBNull.Value },
                new SqlParameter("NUMERO_CUOTAS", SqlDbType.Int){ Value = (object)comprobantePago.NumeroCuotas ?? DBNull.Value },
                new SqlParameter("NUMERO_CUOTA_ACTUAL", SqlDbType.Int){ Value = (object)comprobantePago.NumeroCuotaActual ?? DBNull.Value },
                new SqlParameter("MONTO_COMPROBANTE", SqlDbType.Decimal){ Value = (object)comprobantePago.MontoComprobante ?? DBNull.Value },
                new SqlParameter("FECHA_PAGO", SqlDbType.DateTime){ Value = (object)comprobantePago.FechaPago ?? DBNull.Value },
                new SqlParameter("FECHA_PROGRAMADA", SqlDbType.DateTime){ Value = (object)comprobantePago.FechaProgramada ?? DBNull.Value },
                new SqlParameter("OBSERVACIONES", SqlDbType.NVarChar){ Value = (object)comprobantePago.Observaciones ?? DBNull.Value },                
                new SqlParameter("CODIGO_ESTADO", SqlDbType.NVarChar){ Value = (object)comprobantePago.CodigoEstado ?? DBNull.Value },
                new SqlParameter("USUARIO_CREACION", SqlDbType.NVarChar){ Value = (object)comprobantePago.UsuarioCreacion ?? DBNull.Value },
             };
            return this.dataBaseProvider.ExecuteStoreProcedureNonQuery("VTA.USP_COMPROBANTE_PAGO_INS", parametros);
            //return this.dataBaseProvider.ExecuteStoreProcedureScalar<int>("VTA.USP_COMPROBANTE_PAGO_INS", parametros);
        }

        public int Modificar(ComprobantePagoEntity comprobantePago)
        {
            SqlParameter[] parametros = new SqlParameter[]
            {
                new SqlParameter("CODIGO_COMPROBANTE_PAGO", SqlDbType.Int) { Value = (object)comprobantePago.CodigoComprobantePago ?? DBNull.Value },
                new SqlParameter("CODIGO_ORDEN_COMPRA", SqlDbType.Int) { Value = (object)comprobantePago.CodigoOrdenCompra ?? DBNull.Value },
                new SqlParameter("TIPO_COMPROBANTE_ORDEN", SqlDbType.NVarChar) { Value = (object)comprobantePago.TipoComprobanteOrden ?? DBNull.Value },
                new SqlParameter("NUMERO_COMPROBANTE_APAGAR", SqlDbType.NVarChar) { Value = (object)comprobantePago.NumeroComprobanteApagar ?? DBNull.Value },
                new SqlParameter("CODIGO_MONEDA", SqlDbType.NVarChar) { Value = (object)comprobantePago.CodigoMoneda ?? DBNull.Value },
                new SqlParameter("CODIGO_PROVEEDOR", SqlDbType.Int) { Value = (object)comprobantePago.CodigoProveedor ?? DBNull.Value },
                new SqlParameter("NOMBRE_PROVEEDOR", SqlDbType.NVarChar){ Value = (object)comprobantePago.NombreProveedor ?? DBNull.Value },
                new SqlParameter("ADELANTO_CUOTAS", SqlDbType.Bit){ Value = (object)comprobantePago.AdelantoCuotas ?? DBNull.Value },
                new SqlParameter("NUMERO_CUOTAS", SqlDbType.Int){ Value = (object)comprobantePago.NumeroCuotas ?? DBNull.Value },
                new SqlParameter("NUMERO_CUOTA_ACTUAL", SqlDbType.Int){ Value = (object)comprobantePago.NumeroCuotaActual ?? DBNull.Value },
                new SqlParameter("MONTO_COMPROBANTE", SqlDbType.Decimal){ Value = (object)comprobantePago.MontoComprobante ?? DBNull.Value },
                new SqlParameter("FECHA_PAGO", SqlDbType.DateTime){ Value = (object)comprobantePago.FechaPago ?? DBNull.Value },
                new SqlParameter("FECHA_PROGRAMADA", SqlDbType.DateTime){ Value = (object)comprobantePago.FechaProgramada ?? DBNull.Value },
                new SqlParameter("OBSERVACIONES", SqlDbType.NVarChar){ Value = (object)comprobantePago.Observaciones ?? DBNull.Value },                
                new SqlParameter("CODIGO_ESTADO", SqlDbType.NVarChar){ Value = (object)comprobantePago.CodigoEstado ?? DBNull.Value },
                new SqlParameter("USUARIO_MODIFICACION", SqlDbType.NVarChar){ Value = (object)comprobantePago.UsuarioModificacion ?? DBNull.Value },
             };
            return this.dataBaseProvider.ExecuteStoreProcedureNonQuery("VTA.USP_COMPROBANTE_PAGO_UDP", parametros);
            //return this.dataBaseProvider.ExecuteStoreProcedureScalar<int>("VTA.USP_COMPROBANTE_PAGO_INS", parametros);
        }

        public int ModificarEstado(List<int> codigos, string codigoEstado, string usuario)
        {
            var lista = codigos.Select(x => new
            {
                CODIGO = x
            }).ToList();

            SqlParameter[] parametros = new SqlParameter[]
            {
                
                new SqlParameter("LISTA_CODIGO", SqlDbType.Structured) { Value = lista.ToDataTable(), TypeName = "GRL.TYPE_LISTA_CODIGO" },
                new SqlParameter("CODIGO_ESTADO", SqlDbType.VarChar){ Value = (object)codigoEstado ?? DBNull.Value },
                new SqlParameter("USUARIO_MODIFICACION", SqlDbType.VarChar){ Value = (object)usuario ?? DBNull.Value }
            };
            return this.dataBaseProvider.ExecuteStoreProcedureNonQuery("VTA.USP_COMPROBANTE_PAGO_ESTADO_UDP", parametros);
        }
    }
}
